/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package presentacion.comun;

import hibernate.objeto.Paciente;
import hibernate.objeto.Persona;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import logica.PacienteLogica;
import logica.PersonaDeContactoLogica;
import logica.PersonaLogica;
import logica.TutorLogica;
import presentacion.GestionPacientePresentacion;
import presentacion.acceso.RestriccionAcceso;
import presentacion.paciente.PacientePresentacion;
import presentacion.persona.PersonaPresentacion;
import presentacion.persona.ReasignarContactoAPacientePresentacion;
import presentacion.utilidad.MensajePresentacion;
import presentacion.utilidad.tabla.MiModeloTabla;

/**
 *
 * @author Gonzalo
 */
public class ComunPersonaPresentacion {

    /**
     * Agrega una persona.
     */
    public static void agregarPersona(JTable tablaPersona, JScrollPane jScrollPane) {
        RestriccionAcceso.PersonaPresentacion(null, true, new Persona());
        
        PacientePresentacion.cargarTablaPersona();

        //Selecciona la persona agregada
        if (PersonaPresentacion.getPersona().getApellidoPersona() != null)
        while (!MiModeloTabla.seleccionarFilaDeTabla(
                String.valueOf(PersonaPresentacion.getPersona().getIdPersona()),
                tablaPersona, jScrollPane)) {
            PacientePresentacion.paginarAdelanteTablaPersona();
        }
    }

    /**
     * Recupera la persona seleccionada y abre la correspondiente ventana para
     * modificarla. (Si la persona es paciente PacientePresentacion y si la
     * persona es contacto PersonaPresentacion.
     *
     * @return true si se modificó correctamente, false en caso contrario
     */
    public static void modificarPersona(JTable tablaPersona,
            PacientePresentacion referenciaJDialog) {
        Persona personaSeleccionada = (Persona) MiModeloTabla.recuperarObjetoDeTabla(
                Persona.class.getName(), tablaPersona);

        if(personaSeleccionada != null){
            Paciente pacienteSeleccionado = PacienteLogica.getPacientePorPersona(
                    personaSeleccionada);
            
            if (pacienteSeleccionado != null &&
            !GestionPacientePresentacion.esPacienteFallecido()) {
                RestriccionAcceso.PersonaPresentacion(
                        null, true, pacienteSeleccionado.getPersona());
            //Es persona de contacto o tutor
            } else {
                RestriccionAcceso.PersonaPresentacion(
                        null, true, personaSeleccionada);
            }

            if (referenciaJDialog != null) {
                referenciaJDialog.personalizarGUI(true);
                return;
            }

            MiModeloTabla.cargarTablaPersona(
                    PersonaLogica.getVectorPersonaYEnBd(), tablaPersona);
            MiModeloTabla.seleccionarFilaDeTabla(String.valueOf(
                    personaSeleccionada.getIdPersona()), tablaPersona, null);
        }
    }

    /**
     * Elimina la persona.
     *
     * @param tablaPersona La tabla de personas
     */
    public static void eliminarPersona(JTable tablaPersona,
            PacientePresentacion referenciaJDialog) {
        Persona personaSeleccionada = (Persona)
                MiModeloTabla.recuperarObjetoDeTabla(
                Persona.class.getName(), tablaPersona);
        if (personaSeleccionada != null) {
            if (!PacienteLogica.esPaciente(personaSeleccionada)) {
                //Sólo se elimina si no es paciente
            int confirmado = MensajePresentacion.confimarEliminacionObjeto(
                    "Persona", "la");

                    if (JOptionPane.OK_OPTION == confirmado) {
                        if (PersonaDeContactoLogica.esPersonaDeContacto(
                                personaSeleccionada)
                         || TutorLogica.esTutor(personaSeleccionada)) {
                            if (MensajePresentacion.
                                    confirmarReasignarContactosAlEliminarPersona(
                                    personaSeleccionada) == 0) {
                                //Se debe reasignar si es contacto
                                if (reasignarContactoAPaciente(
                                        personaSeleccionada)) {
                                    //Si la reasignación fue exitosa se elimina
                                    PersonaLogica.
                                            eliminarPersona(personaSeleccionada);
                                    if (referenciaJDialog != null) {
                                        referenciaJDialog.personalizarGUI(true);
                                        return;
                                    }
                                }
                            }
                        } else {
                            //Si no es paciente y no hay que reasignar se elimina
                            //directamente
                            PersonaLogica.eliminarPersona(personaSeleccionada);
                            if (referenciaJDialog != null) {
                                referenciaJDialog.personalizarGUI(true);
                                return;
                            }

                        }
                    }
                if (referenciaJDialog != null) {
                    referenciaJDialog.personalizarGUI(true);
                    return;
                } else {
                    MiModeloTabla.cargarTablaPersona(
                            PersonaLogica.getVectorPersonaYEnBd(),
                            tablaPersona);
                }
            } else {
                MensajePresentacion.informarImposibilidadOperacionPersonaEsPaciente(
                        personaSeleccionada);
            }
        }
    }

    /**
     * Reasigna las personas correspondientes al paciente, ya sea en calidad
     * de tutor o persona de contacto.
     *
     */
    public static boolean reasignarContactoAPaciente(Persona persona) {
        RestriccionAcceso.ReasignarContactoAPacientePresentacion(
                null, true, persona);

        // Si las personas fueron reasignadas se podrá cambiar la edad.
        if (ReasignarContactoAPacientePresentacion.isReasignacionExitosa()) {
            return true;
        } else {
            return false;
        }
    }
}
